package com.liwalo.action;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.liwalo.dao.AtributoDAO;
import com.liwalo.dao.ImgProductoDAO;
import com.liwalo.dao.ListadoCiudadDAO;
import com.liwalo.dao.MediosContactoDAO;
import com.liwalo.dao.ProductoDAO;
import com.liwalo.dao.ValorDAO;
import com.liwalo.entities.Atributo;
import com.liwalo.entities.ImgProducto;
import com.liwalo.entities.ListadoCiudad;
import com.liwalo.entities.MediosContacto;
import com.liwalo.entities.Producto;
import com.liwalo.entities.ProductosPedido;
import com.liwalo.entities.Usuario;
import com.liwalo.entities.Valor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class Carrito  extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5435121107187527122L;
	private int producto_Id;
	private int atributoid;
	private int valorid;
	private int unidades;
	private double totalprecio;
	private int idref;
	private List<ProductosPedido> listadocarrito;
	private List<ListadoCiudad> listadociudad;
	

	
	@Override
	public String execute() throws Exception {
		Map parameters = ActionContext.getContext().getParameters();
		Map session = ActionContext.getContext().getSession();
	
		Producto productovo=new Producto();
		ProductosPedido prodpedidovo =new ProductosPedido();
		Atributo atributovo = new Atributo();
		Valor valorvo=new Valor();
		Usuario user= new Usuario();
		
		MediosContactoDAO mediosDao=new MediosContactoDAO();
		ProductoDAO productoDao =new ProductoDAO();
		ValorDAO valorDao=new ValorDAO();
		AtributoDAO atributoDao=new AtributoDAO();
		ListadoCiudadDAO listadoCiudadDao=new ListadoCiudadDAO();
		
		java.util.Date fechaActual = new java.util.Date();
		
		//Verificamos que la sesion venga vacia , si SI , Creamos el usuario invitado y una nueva lista de carrito 
		//Si no , obtenemos el listado del carrito
		 if(session==null || session.isEmpty()){
			 
				user.setNombre("Invitado");
				session.put("login", "true");
		        session.put("userName", "Invitado"+new Timestamp(fechaActual.getTime()));
		        session.put("usuario", user);
		        listadocarrito=new ArrayList<ProductosPedido>();
		        session.put("listadocarrito", listadocarrito);
		 }else{

				 
			 	listadocarrito=(List<ProductosPedido>) session.get("listadocarrito");
		 }
		 
		 //Verificamos si por error vienen la lista del carrito a NULL
		 if(null==listadocarrito){
			 listadocarrito=new ArrayList<ProductosPedido>();
		 }
		 
		 //Si el Usuario no es INVITADO , obteemos de la sesion
		 if(!("Invitado").equals(user.getNombre()) && user.getNombre()!=null){
			 user=(Usuario)session.get("usuario");
			 List<MediosContacto> lista=new ArrayList<MediosContacto>();
			 lista=mediosDao.ListfindById(user);
			 session.put("usuario", user);
		 }
				
		 		//Bubscamos el producto junto con su atributo y valor
				productovo= productoDao.findById(producto_Id);
				atributovo=atributoDao.findById(atributoid);
				valorvo=valorDao.findById(valorid);
				
				//Lo agregamos al Objeto carrito
				prodpedidovo.setId(productovo.getId());
				prodpedidovo.setProductoId(productovo);
				prodpedidovo.setAtributoId(atributovo);
				prodpedidovo.setValorId(valorvo);
				prodpedidovo.setUnidades(unidades);
				prodpedidovo.setPrecioUnidad(productovo.getPrecio());
				prodpedidovo.setPreciototal((productovo.getPrecio() * unidades));
				
				//Agregamos al Carrito
				listadocarrito.add(prodpedidovo);
				
				//Obtener el total del precio de los productos con unidades
				
				Iterator<ProductosPedido> iterador = listadocarrito.listIterator(); 
				totalprecio=0;
				while( iterador.hasNext() ) {
					ProductosPedido pro = (ProductosPedido) iterador.next(); 
					totalprecio+=pro.getPreciototal();
			}
				
				listadociudad = new ArrayList<ListadoCiudad>();				
				listadociudad=listadoCiudadDao.findAllListadoCiudad();
				
				session.put("listadocarrito", listadocarrito);
		
				
		return SUCCESS;
	}

	
	/**
	 * Eliminar del listado el producto del carrito
	 * @return
	 */
	public String eliminarCarrito() throws Exception{
		
		System.out.println("Action .... Eliminar del Carrito ... idRef :"+getIdref());
		Map session = ActionContext.getContext().getSession();
		listadocarrito=(List<ProductosPedido>) session.get("listadocarrito");
		if(getIdref()!=0){
			System.out.println("Listado del Carrito :" +listadocarrito);
			ProductosPedido prodpedidovo =new ProductosPedido();
			prodpedidovo.setId(getIdref());
			
			listadocarrito.remove(prodpedidovo);
			
			//Obtener el total del precio de los productos con unidades
			
			Iterator<ProductosPedido> iterador = listadocarrito.listIterator(); 
			totalprecio=0;
			while( iterador.hasNext() ) {
				ProductosPedido pro = (ProductosPedido) iterador.next(); 
				totalprecio+=pro.getPrecioUnidad();
			}
		}else{
			Iterator<ProductosPedido> iterador = listadocarrito.listIterator(); 
			totalprecio=0;
			while( iterador.hasNext() ) {
				ProductosPedido pro = (ProductosPedido) iterador.next(); 
				totalprecio+=pro.getPrecioUnidad();
			}
		}
		
		
		session.put("listadocarrito", listadocarrito);
		
		System.out.println(" listado carrrito : "+listadocarrito);
		System.out.println(" Total precio "+totalprecio);
		
		return SUCCESS;
	}
	
	

	public int getProducto_Id() {
		return producto_Id;
	}




	public void setProducto_Id(int producto_Id) {
		this.producto_Id = producto_Id;
	}

	public List<ProductosPedido> getListadocarrito() {
		return listadocarrito;
	}




	public void setListadocarrito(List<ProductosPedido> listadocarrito) {
		this.listadocarrito = listadocarrito;
	}




	public int getAtributoid() {
		return atributoid;
	}




	public void setAtributoid(int atributoid) {
		this.atributoid = atributoid;
	}




	public int getValorid() {
		return valorid;
	}




	public void setValorid(int valorid) {
		this.valorid = valorid;
	}




	public int getUnidades() {
		return unidades;
	}




	public void setUnidades(int unidades) {
		this.unidades = unidades;
	}




	public double getTotalprecio() {
		return totalprecio;
	}




	public void setTotalprecio(double totalprecio) {
		this.totalprecio = totalprecio;
	}


	public int getIdref() {
		return idref;
	}


	public void setIdref(int idref) {
		this.idref = idref;
	}










	
	
}
